const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
require('dotenv').config();

// 导入配置和中间件
const logger = require('./config/logger');
const { testConnection } = require('./config/database');
const responseMiddleware = require('./middleware/response');
const { errorHandler, notFoundHandler } = require('./middleware/errorHandler');

// 导入路由
const routes = require('./routes');

// 创建Express应用
const app = express();

// 安全中间件
app.use(helmet());

// CORS配置
app.use(cors({
  origin: process.env.NODE_ENV === 'production' 
    ? ['https://yourdomain.com'] 
    : ['http://localhost:8080', 'http://127.0.0.1:8080'],
  credentials: true
}));

// 限流中间件
const limiter = rateLimit({
  windowMs: (process.env.RATE_LIMIT_WINDOW || 15) * 60 * 1000, // 15分钟
  max: process.env.RATE_LIMIT_MAX || 100, // 限制每个IP每15分钟最多100个请求
  message: {
    code: 429,
    message: '请求过于频繁，请稍后再试',
    data: null,
    timestamp: Date.now()
  }
});
app.use('/api', limiter);

// 请求解析中间件
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));

// 静态文件服务
app.use('/uploads', express.static('uploads'));
app.use('/exports', express.static('exports'));

// 请求日志中间件
app.use((req, res, next) => {
  logger.info(`${req.method} ${req.path} - IP: ${req.ip}`);
  next();
});

// 响应格式中间件
app.use(responseMiddleware);

// API路由
app.use('/api', routes);

// 根路径
app.get('/', (req, res) => {
  res.success({
    message: '欢迎使用代账记账系统API',
    version: '1.0.0',
    documentation: '/api/info'
  });
});

// 404处理
app.use(notFoundHandler);

// 全局错误处理
app.use(errorHandler);

// 启动服务器
const PORT = process.env.PORT || 3000;

async function startServer() {
  try {
    // 测试数据库连接
    logger.info('正在测试数据库连接...');
    const dbConnected = await testConnection();
    
    if (!dbConnected) {
      logger.warn('数据库连接失败，服务将在无数据库模式下启动');
      logger.warn('请确保MySQL已安装并配置好数据库连接信息');
    }

    // 启动HTTP服务器
    const server = app.listen(PORT, () => {
      logger.info(`🚀 服务器启动成功`);
      logger.info(`📍 服务地址: http://localhost:${PORT}`);
      logger.info(`🌍 环境: ${process.env.NODE_ENV || 'development'}`);
      logger.info(`📊 健康检查: http://localhost:${PORT}/api/health`);
    });

    // 优雅关闭
    process.on('SIGTERM', () => {
      logger.info('收到SIGTERM信号，正在关闭服务器...');
      server.close(() => {
        logger.info('服务器已关闭');
        process.exit(0);
      });
    });

  } catch (error) {
    logger.error('服务器启动失败:', error);
    process.exit(1);
  }
}

// 启动应用
startServer();

module.exports = app; 